package com.sun.test;

/**
 * 运算符:
 *      算术运算符:+ - * / % ++ --
 *      赋值运算符:=
 *      =:表示赋值操作,==:左右两个变量是否相等
 *      扩展赋值运算符:+= -= *= /=
 *      关系运算符:> >= < <= == !=
 *      逻辑运算符:&& || !
 *      位运算符:& | ^ ~ >> << >>>(了解)
 *      条件运算符:? :
 * 类的声明:访问修饰符  class 类名 {方法体}
 * 一个包下可以有多个类,但是只能有一个public修饰
 */
public class OperatorDemo {
    /*
    * 方法的声明格式:
    *           访问修饰符 静态的 返回值类型 方法名(形参1,形参2...形参n){方法体}
    * */
    public static void main(String[] args) {
        //声明一个变量,变量的名字叫num1
        int num1=1;
        //声明一个变量,变量的名字叫num2
        int num2=2;
        //方式1:再声明一个变量,名字叫result,用来存储num1,num2做运算的结果
        int result;
        result=num1+num2;
        System.out.println("num1+num2的结果为:"+result);
        result=num1-num2;
        System.out.println("num1-num2的结果为:"+result);
        result=num1*num2;
        System.out.println("num1*num2的结果为:"+result);
        //取整除或者取商
        result=num1/num2;
        System.out.println("num1/num2的结果为:"+result);
        //取余数,或者取模
        result=num1%num2;
        System.out.println("num1%num2的结果为:"+result);
        /*
        * 单目运算符
        * ++:表示在原有的基础上+1,谁在前,先运算谁
        * --++:表示在原有的基础上-1,谁在前,先运算谁
        * */
        System.out.println("单目运算符++操作num1++:"+num1++);
        System.out.println("单目运算符++操作num1:"+(++num1));
        System.out.println("单目运算符--操作num1--:"+num1--);
        System.out.println("单目运算符--操作num1:"+(--num1));
        System.out.println(++num2+num2++);
        //扩赋值运算符
        int num3=1;
        //两种写法意义一样,表示加2的基本操作
        num3=num3+2;
        System.out.println(num3);
        System.out.println(num3+=2);;
        //类型转换问题,num4是byte,num4+1整体变成int类型,需要将int类型的只转换为byte,会有精度损失,因此需要强转
        byte num4=10;
        //num4=num4+1;
        num4+=1;
        System.out.println("类型转换:"+num4);
        /*
        * 关系运算符:返回值是boolean类型,返回值只有true,false
        * */
        System.out.println("关系运算符>:"+(1>2));
        System.out.println("关系运算符<:"+(1<2));
        System.out.println("关系运算符>=:"+(1>=2));
        System.out.println("关系运算符<=:"+(1<=2));
        System.out.println("关系运算符==:"+(1==2));
        System.out.println("关系运算符!=:"+(1!=2));
        /*
        * 逻辑运算符:
        *   &&:表示短路与,两边表达式中,只要有一个是false,整体结果就是false
        *       两边表达式从左向右开始对比,如果左边的表达式是false,右边不需要进行判断
        *   ||:短路或:表示两边表达式中只要有一个是true,整体结果就是true
        *       两边表达式从左向右开始对比,如果左边的表达式是true,右边不需要进行判断
        *   !:取反，如果是true，取反是false，如果是false，取反就是true
        *   &:与运算符，但是两都会参与运算
        *   |:或运算符，两边都会参与运算
        * */
        System.out.println("逻辑运算符&&(短路与):"+(3>5 && 3<4));
        System.out.println("逻辑运算符||(短路或):"+(3>5 || 3<4));
        System.out.println("逻辑运算符!(取反):"+!true);
        System.out.println("逻辑运算符!(取反):"+!false);
        //位运算符:只能操作数值,操作的时候会转成二进制进行运算
        System.out.println("位运算符&:"+(4 & 5));
        System.out.println("位运算符|:"+(4 | 5));
        System.out.println("位运算符^:"+(4 ^ 5));
        //移码,补码,原码,反码
        System.out.println(~4);
        //左移表示乘以2,右移表示除以2
        System.out.println("左移:"+(2<<3));
        System.out.println("右移:"+(16>>2));
        /*
        * 条件运算符或者三目运算符
        * 使用的时候需要跟一个表达式,表达式如果是true,则返回?后的结果,如果是false,则返回:后的结果
        * */
        System.out.println("三目运算符:"+(3>2 ?3:2));
        System.out.println(false?false:true?false:true);
        /*
        * 基本类型之间的转换:
        *   自动转换(隐式转换):
        *   强制转换:
        *   注意:
        *       1.在进行算术运算符操作的时候,必须要数据类型一致,否则无法操作
        *       2.在运算过程中,如果两个值的类型不一致,会自动将小的类型转换为大的类型
        *       3.在运算过程中,可以手动强制转换,将大的数据类型转为小的数据类型
        *       4.强制转换,会发生精度损失,结果可能不准确
        * */
        byte a=10;
        int b=200;
        byte c;
        c=(byte)(a+b);
        System.out.println("类型转换:"+c);
    }
}
